#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
//返回的数据应该时static修饰的或者时malloc的或者时全局变量 不会随着函数调用结束而销毁的数据
int& Count()
{
	static int s_n = 0;
	s_n++;
	return s_n;
}
//函数内部创建普通局部变量  函数调用结束时布局变量也会被销毁 这种情况不能引用返回 否则结果不确定
int& Add(int a, int b)
{
	int c = a + b;
	return c;
}
int main()
{
	//int a = 10;
	//int& ra = a;//定义引用类型ra
	//cout << "a=" << a << endl;
	//cout << "ra=" << ra << endl;
	//ra++;//改变ra  实际上就是改变a
	//cout << "a=" << a << endl;
	//cout << "ra=" << ra << endl;
	//a++;//改变a ra也会改变
	//cout << "a=" << a << endl;
	//cout << "ra=" << ra << endl;
	//int a = 10;
	//int& ra = a;
	//int c = 20;
	//ra = c;
	//const int a = 10;
	////int& ra = a;//a本来是常变量 不能修改 而ra是整形 权限被放大了 语法不支持
	//const int& ra = a;//正确写法

	//int b = 10;
	//const int& rb = b;//b本来是可改的 而rb不能改 权限被缩小了 语法支持

	////int& c = 10;//给常量取别名，常量不能被修改 权限放大 error
	//const int& rc = 10;//正确写法

	//double d = 3.14;
	////int& rd = d;//类型不同 编译错误
	//const int& rd = d;//从double到int会存在隐式类型转换 类型转换会产生临时变量，临时变量具有常性所以支持

	//int i = 1;
	//double j = i;//i-->j产生临时变量
	//const double& ri = i;
	int a = 10;
	int b = 20;
	Swap(a,b);
	/*cout << Count() << endl;
	cout << Count() << endl;*/
	cout << Add(1, 2) << endl;
	return 0;
}